﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Fintech.Utils;

namespace ZOVNP.Model.Abstracts
{
    /// <summary> Атрибут для связывания интерфейсов объектов модели с классами их конкретных реализаций. </summary>
    [AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
    public sealed class DomainObjectAttribute : Attribute
    {
        private Type t, _base;
        /// <summary> Создать атрибут. </summary>
        /// <param name="DomainObjectInterfaceType"> Интерфейс модели. </param>
        /// <param name="DomainObjectBaseInterfaceType"> Родительский интерфейс. </param>
        /// <exception cref="ArgumentException"> Если переданный тип не является интерфейсом или же является шаблонным. </exception>
        public DomainObjectAttribute(Type DomainObjectInterfaceType, Type DomainObjectBaseInterfaceType)
        {
            DomainObjectInterfaceType.CheckOnNull("DomainObjectInterfaceType");
            if (DomainObjectInterfaceType.IsInterface && !DomainObjectInterfaceType.IsGenericType) t = DomainObjectInterfaceType;
            else throw new ArgumentException(Properties.Resources.MSG_CtorInterfaceParam);
            if (DomainObjectBaseInterfaceType != null)
            {
                if (DomainObjectBaseInterfaceType.IsInterface && !DomainObjectBaseInterfaceType.IsGenericType) _base = DomainObjectBaseInterfaceType;
                else throw new ArgumentException(Properties.Resources.MSG_CtorInterfaceParam);
            }
        }
        public DomainObjectAttribute(Type DomainObjectInterfaceType) : this(DomainObjectInterfaceType, null) { }
        /// <summary> Интерфейс, с которым работает модель и с которым будет связан класс, маркируемый этим атрибутом. </summary>
        /// <value> Экземпляр заданного интерфейса. </value>
        public Type DomainObjectInterfaceType { get { return t; } }
        /// <summary> Родительский интерфейс. </summary>
        public Type DomainObjectBaseInterfaceType { get { return _base; } }
    }
}
